// 路由

// 1.引入依赖项目
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes原始组件'
import store from '@/store'
// 2.注册组件
Vue.use(VueRouter)

// 原型上修改push方法
const originPush = VueRouter.prototype.push // 将之前的存进一个变量中
const originReplace = VueRouter.prototype.replace

// 修改VueRouter原型上的push
VueRouter.prototype.push = function (location, okCallBack, errCallBack) {
    if (okCallBack === undefined && errCallBack === undefined) {
        originPush.call(this, location).catch(() => {}) // 统一处理报错问题
    } else {
        originPush.call(this, location, okCallBack, errCallBack)
    }
}

// 修改VueRouter原型上的replace
VueRouter.prototype.replace = function (location, okCallBack, errCallBack) {
    if (okCallBack === undefined && errCallBack === undefined) {
        // 上面的判断成立的话，表示没有传递这两个参数
        originReplace.call(this, location).catch(() => {})
    } else {
        originReplace.call(this, location, okCallBack, errCallBack)
    }
}

const router = new VueRouter({
    mode: 'history',
    routes,
    // 处理跳转新页面时滚动行为
    scrollBehavior(to, from, savedPosition) {
        // to表示到达的路由目标对象
        // from表示来自于哪个路由对象
        if (savedPosition) {
            return savedPosition
        } else {
            return {
                x: 0,
                y: 0
            }
        }
    }
})

// 路由白名单 这些路径不需要登录
const whiteList = [
    "home",
    "login",
    "register",
    "search",
    "detail",
    "addCartSuccess",
    "shopCart",
];
router.beforeEach((to, from, next) => {
    // 放行的条件:
    // 1. 需要放行的页面，我们才给放行  login register home detail search shopcart
    // 2. 某些需要登陆才能查看的页面，如果有token的话 也可以放行
    // 3. 其余的情况必须先登陆 可以让其先跳转到登陆页面
    if(whiteList.includes(to.name) || store.state.user.userInfo.token) {
        next()
        return  // 不再向下执行
    }
    // 跳转到登录页面
    next({
        name: 'login',
        query: {
            redirct: to.path,   // 表示之前访问的页面 在地址栏拼接
        }
    })
})

// 4.导出路由对象
export default router